package com.funo.main.service.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import com.funo.common.pojo.PageResult;
import com.funo.common.pojo.QueryCondition;
import com.funo.common.pojo.TreeNode;
import com.funo.common.utils.Constant;
import com.funo.main.dao.ModuleDao;
import com.funo.main.dao.RoleModuleDao;
import com.funo.main.entities.Module;
import com.funo.main.entities.RoleModule;
import com.funo.main.service.ModuleService;

/**
 * 模块管理业务接口实现类
 * 
 * @author zhengjs
 *
 */
@Service
@Transactional
public class ModuleServiceImpl implements ModuleService {
	
	@Autowired
	private ModuleDao moduleDao;//模块管理DAO
	
	@Autowired
	private RoleModuleDao roleModuleDao;//角色模块DAO

	@Override
	public List<Module> findModule(String id) {
		
		if (StringUtils.isEmpty(id)) {
			return moduleDao.getMenu();
		} else {
			return moduleDao.getMenu(id);
		}
	}
	
	@Override
	public List<Module> findParentModule(String id){
		return moduleDao.getMenu(id);
	}

	@Override
	public TreeNode moduleTree() {
		
		TreeNode root = new TreeNode();
		
		root.setChildren(modules2TreeNodes(moduleDao.getMenu()));
		
		for (TreeNode treeNode : root.getChildren()) {
			treeNode.setChildren(modules2TreeNodes(moduleDao.getMenu(treeNode.getId())));
		}
		
		return root;
	}

	public List<TreeNode> modules2TreeNodes(List<Module> modules) {
		
		List<TreeNode> treeNodes = new ArrayList<TreeNode>();
		
		TreeNode treeNode;
		
		for (Module module : modules) {
			treeNode = new TreeNode(module.getId(), module.getText(), module.getIconCls(), module.getIsLeaf(), null, true);
			treeNodes.add(treeNode);
		}
		
		return treeNodes;
	}
	
	public List<TreeNode> modules2TreeNodes(List<Module> modules,List<RoleModule> roleModules) {
		
		List<TreeNode> treeNodes = new ArrayList<TreeNode>();
		
		for (Module module : modules) {
			TreeNode treeNode = new TreeNode(module.getId(), module.getText(), module.getIconCls(), module.getIsLeaf(), false, true);
			treeNodes.add(treeNode);
		}
		
		if(roleModules!=null&&roleModules.size()>0){
			
			for (TreeNode treeNode : treeNodes) {
				
				for (Iterator<RoleModule> iterator = roleModules.iterator(); iterator.hasNext();) {
					
					RoleModule roleModule = iterator.next();
					
					if(treeNode.getId().equals(roleModule.getModule().getId())){
						treeNode.setChecked(true);
						iterator.remove();
					}
				}
			}
		}
		
		return treeNodes;
	}

	@Override
	public PageResult<Module> getModulePage(QueryCondition condition) {
		
		PageResult<Module> page = new PageResult<Module>();
		
		page.setList(moduleDao.pageList(condition));
		page.setTotal(moduleDao.count(condition));
		
		return page;
	}

	@Override
	public Integer addModule(Module module, String parentID) {

		Integer type=Constant.STATUS_ABNORMAL;//初始为0
		
		Module moduleTl=moduleDao.getModule(module.getText());//通过模块名,获取模块信息.

		if(moduleTl !=null && moduleTl.getId() !=null){//重复
			type = Constant.STATUS_REPEAT;//重复标识,2
		}else{
			
			module.setId(UUID.randomUUID().toString());//主键ID
			
			if(parentID=="" || parentID.equals("")){
				module.setParentModule(null);//父类模块ID
				module.setIsLeaf("N");//不是叶子结点
			}else{
				Module moduleChild=moduleDao.get(parentID);//通过ID,获取模块父类模块信息.
				module.setParentModule(moduleChild);
				module.setIsLeaf("Y");//是叶子结点
			}
			
			moduleDao.save(module);//保存操作
			
			type = Constant.STATUS_SUSSESS;//成功标识,1
		}
		
		return type;
	}

	@Override
	public Integer updateModule(Module module) {

		Integer type = Constant.STATUS_ABNORMAL;
		
		//通过模块名称和主键id，查询模块信息。
		Module moduleTil = moduleDao.findModuleByText(module.getText(), module.getId());
		
		if(moduleTil !=null && moduleTil.getId() !=null){//重复
			type = Constant.STATUS_REPEAT;
		}else{
			//通过id，查询模块信息。
			Module oldModule = moduleDao.get(module.getId());
			
			oldModule.setText(module.getText());//名称
			oldModule.setOrderNum(module.getOrderNum());//排列序号
			
			Module parentModule = oldModule.getParentModule();
			
			if(parentModule!=null){//叶子结点
				oldModule.setParentModule(parentModule);
				oldModule.setComponent(module.getComponent());//组件名称
			}else{//父类节点
				oldModule.setParentModule(null);
				oldModule.setComponent("");//组件名称
			}
			
			oldModule.setIconCls(module.getIconCls());//图标
			
			moduleDao.update(oldModule);//更新操作
			
			type = Constant.STATUS_SUSSESS;
		}

		return type;
	}

	@Override
	public TreeNode roleModuleTree(String id) {
		
		if("root".equals(id.toLowerCase())){
			return moduleTree();
		}else{
			
			TreeNode root = new TreeNode();
			
			List<RoleModule> roleModules = roleModuleDao.getByRole(id);
			
			root.setChildren(modules2TreeNodes(moduleDao.getMenu(),roleModules));
			
			for (TreeNode treeNode : root.getChildren()) {
				treeNode.setChildren(modules2TreeNodes(moduleDao.getMenu(treeNode.getId()),roleModules));
			}
			
			return root;
		}
	}
	
	@Override
	public void checkRoleModule(RoleModule roleModule, boolean checked) {
		
		if(checked){
			roleModule.setId(UUID.randomUUID().toString());
			roleModuleDao.save(roleModule);
		}else{
			roleModuleDao.deleteByHql(roleModule);
		}
	}
	
	@Override
	public Module getModule(String id) {
		return moduleDao.get(id);
	}

	@Override
	public void deleteModule(Module module) {
		moduleDao.delete(module.getId());
	}
}
